{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Аггрегация разметки датасета ruTiE"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "В разметке были 430 бинарных вопроса в двух сеттингах:\n",
    "- с показом истории ответов разметчика на все предыдущие вопросы\n",
    "- без показа истории\n",
    "\n",
    "Контроль качества производился в ручном режиме на стороне АБК, потому этап фильтрации пропускается.\n",
    "\n",
    "В качестве метрики используется Accuracy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import json\n",
    "import ast"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "pool1 = pd.read_csv('pool1.tsv', sep='\\t')\n",
    "pool2 = pd.read_csv('pool2.csv', sep=';')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "При наличии истории разметчикам предлагалось на основании имеющихся предыдущих вопросов и своих ответов на них, а также одного нового вопроса с двумя вариантами ответа ответить на вопрос, какой ответ является правильным.\n",
    "\n",
    "В отсутствие истории разметчикам предлагалось на основании только одного вопроса с двумя вариантами ответа ответить на вопрос, какой ответ является правильным.\n",
    "\n",
    "Вход: \n",
    "- question (пример: `Сколько звезд на небе?`).\n",
    "- answer_1 (пример: `Несчетное количество`).\n",
    "- answer_2 (пример: `Звезд не существует`).\n",
    "\n",
    "Выход:\n",
    "- OUTPUT:answer_output (целое число: `1` или `2`)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>INPUT:dialog</th>\n",
       "      <th>OUTPUT:answer</th>\n",
       "      <th>OUTPUT:result</th>\n",
       "      <th>ASSIGNMENT:time_spent</th>\n",
       "      <th>ASSIGNMENT:date_start</th>\n",
       "      <th>ASSIGNMENT:date_end</th>\n",
       "      <th>ASSIGNMENT:user_id</th>\n",
       "      <th>ASSIGNMENT:result_id</th>\n",
       "      <th>ASSIGNMENT:data_id</th>\n",
       "      <th>ASSIGNMENT:status</th>\n",
       "      <th>ASSIGNMENT:worker_id</th>\n",
       "      <th>ASSIGNMENT:reward</th>\n",
       "      <th>ASSIGNMENT:assignment_id</th>\n",
       "      <th>ACCEPT:verdict</th>\n",
       "      <th>ACCEPT:comment</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>[{\"answer_1\":\"Четыре\",\"answer_2\":\"Сто\",\"questi...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>[{\"question\":\"Сколько ножек у стола?: Четыре и...</td>\n",
       "      <td>36077</td>\n",
       "      <td>2023-11-10 09:25:22</td>\n",
       "      <td>2023-11-10 19:26:39</td>\n",
       "      <td>21222</td>\n",
       "      <td>236363631</td>\n",
       "      <td>65553487</td>\n",
       "      <td>SUBMITTED</td>\n",
       "      <td>21222</td>\n",
       "      <td>0</td>\n",
       "      <td>9246116</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                        INPUT:dialog  OUTPUT:answer  \\\n",
       "0  [{\"answer_1\":\"Четыре\",\"answer_2\":\"Сто\",\"questi...            NaN   \n",
       "\n",
       "                                       OUTPUT:result  ASSIGNMENT:time_spent  \\\n",
       "0  [{\"question\":\"Сколько ножек у стола?: Четыре и...                  36077   \n",
       "\n",
       "  ASSIGNMENT:date_start  ASSIGNMENT:date_end  ASSIGNMENT:user_id  \\\n",
       "0   2023-11-10 09:25:22  2023-11-10 19:26:39               21222   \n",
       "\n",
       "   ASSIGNMENT:result_id  ASSIGNMENT:data_id ASSIGNMENT:status  \\\n",
       "0             236363631            65553487         SUBMITTED   \n",
       "\n",
       "   ASSIGNMENT:worker_id  ASSIGNMENT:reward  ASSIGNMENT:assignment_id  \\\n",
       "0                 21222                  0                   9246116   \n",
       "\n",
       "   ACCEPT:verdict  ACCEPT:comment  \n",
       "0             NaN             NaN  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pool1.head(1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Формат пула необычный, так как разметка велась на платформе АБТ.\n",
    "\n",
    "Сразу проведем расчет затрат на разметку пула, на разметку одного айтема и часовой ставки. Расчеты будут включать только разметку \"с историей\", так как данный формат является основным для датасета и предлагается моделям для решения именно таким. Аналогично, результирующей метрикой считается метрика для датасета \"с историей\"."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "times = 138320\n",
    "budget = 2500"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Возьмем официальный курс на момент проведения подсчетов для перевода рублей в доллары (для единообразия с другими сетами)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "import requests\n",
    "from bs4 import BeautifulSoup\n",
    "\n",
    "url = 'https://cbr.ru/'\n",
    "response = requests.get(url)\n",
    "\n",
    "if not response.ok:\n",
    "    print(f'Something went wrong while processing GET resuest to `{url}`')\n",
    "else:\n",
    "    tree = BeautifulSoup(response.text, 'html')\n",
    "    inds = tree.body.find_all('div', {'class': 'main-indicator_rate'})\n",
    "    usd = list(filter(lambda x: 'USD' in x.text, inds))[0]\n",
    "    course = float(list(filter(lambda x: 'num' in ''.join(x.get('class')), usd.find_all('div')))[-1].text.strip().split(' ')[0].replace(',', '.'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Общие затраты просто переводятся в долларыю. Затраты на 1 айтем - это общие затраты поделить на количество айтемов. Часовая ставка берется из расчета, что в среднем за час делает N айтемов, где N - 3600 секунд поделить на общее время разметки пула, поделенное на количество айтемов в пуле. Данное среднее число айтемов в час умножается на цену пула."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Затраты на разметку тестовой части ruEthics = 27.183\n",
      "Цена за один айтем разметки = 0.063\n",
      "Часовая ставка = 0.707\n"
     ]
    }
   ],
   "source": [
    "num_items = 430  # на один пул приходится 645 бинарных вопросов\n",
    "total = budget / course\n",
    "per_item = total / num_items\n",
    "rate = (3600 / (times / num_items)) * per_item\n",
    "print(f'Затраты на разметку тестовой части ruEthics = {round(total, 3)}')\n",
    "print(f'Цена за один айтем разметки = {round(per_item, 3)}')\n",
    "print(f'Часовая ставка = {round(rate, 3)}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "В функции предобработки переменные q1, q2, q3, q4, q5 использовались для проверки порядка ответа на вопросы, но он везде одинаковый."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def process_pool(pool1):\n",
    "    q1 = [ast.literal_eval(pool1.iloc[0]['OUTPUT:result'])[i]['question'] for i in range(len(ast.literal_eval(pool1.iloc[0]['OUTPUT:result'])))]\n",
    "    a1 = [ast.literal_eval(pool1.iloc[0]['OUTPUT:result'])[i]['answer'] for i in range(len(ast.literal_eval(pool1.iloc[0]['OUTPUT:result'])))]\n",
    "\n",
    "    q2 = [ast.literal_eval(pool1.iloc[1]['OUTPUT:result'])[i]['question'] for i in range(len(ast.literal_eval(pool1.iloc[1]['OUTPUT:result'])))]\n",
    "    a2 = [ast.literal_eval(pool1.iloc[1]['OUTPUT:result'])[i]['answer'] for i in range(len(ast.literal_eval(pool1.iloc[1]['OUTPUT:result'])))]\n",
    "\n",
    "    q3 = [ast.literal_eval(pool1.iloc[2]['OUTPUT:result'])[i]['question'] for i in range(len(ast.literal_eval(pool1.iloc[2]['OUTPUT:result'])))]\n",
    "    a3 = [ast.literal_eval(pool1.iloc[2]['OUTPUT:result'])[i]['answer'] for i in range(len(ast.literal_eval(pool1.iloc[2]['OUTPUT:result'])))]\n",
    "\n",
    "    q4 = [ast.literal_eval(pool1.iloc[3]['OUTPUT:result'])[i]['question'] for i in range(len(ast.literal_eval(pool1.iloc[3]['OUTPUT:result'])))]\n",
    "    a4 = [ast.literal_eval(pool1.iloc[3]['OUTPUT:result'])[i]['answer'] for i in range(len(ast.literal_eval(pool1.iloc[3]['OUTPUT:result'])))]\n",
    "\n",
    "    q5 = [ast.literal_eval(pool1.iloc[4]['OUTPUT:result'])[i]['question'] for i in range(len(ast.literal_eval(pool1.iloc[4]['OUTPUT:result'])))]\n",
    "    a5 = [ast.literal_eval(pool1.iloc[4]['OUTPUT:result'])[i]['answer'] for i in range(len(ast.literal_eval(pool1.iloc[4]['OUTPUT:result'])))]\n",
    "\n",
    "    assert q1 == q2 == q3 == q4 == q5\n",
    "\n",
    "    p1 = pd.DataFrame({'question': q1, 'a1': a1, 'q2': q2, 'a2': a2, 'q3': q3, 'a3': a3, 'q4': q4, 'a4': a4, 'q5': q5, 'a5': a5})\n",
    "    mapping = {'answer_1': 1, 'answer_2': 2}\n",
    "    ans1 = p1[['question', 'a1', 'a2', 'a3', 'a4', 'a5']].copy()\n",
    "    ans1['cons'] = ans1[['a1', 'a2', 'a3', 'a4', 'a5']].apply(lambda x: x.value_counts()[0], axis=1)\n",
    "    ans1['a1'] = ans1['a1'].map(mapping)\n",
    "    ans1['a2'] = ans1['a2'].map(mapping)\n",
    "    ans1['a3'] = ans1['a3'].map(mapping)\n",
    "    ans1['a4'] = ans1['a4'].map(mapping)\n",
    "    ans1['a5'] = ans1['a5'].map(mapping)\n",
    "    ans1['pred'] = ans1[['a1', 'a2', 'a3', 'a4', 'a5']].apply(lambda x: x.value_counts().index[0], axis=1)\n",
    "\n",
    "    return ans1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "df1 = process_pool(pool1)\n",
    "df2 = process_pool(pool2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Собираем все ответы в одну таблицу."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>question</th>\n",
       "      <th>history_cons</th>\n",
       "      <th>history_lb</th>\n",
       "      <th>no_history_cons</th>\n",
       "      <th>no_history_lb</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Сколько ножек у стола?: Четыре или Сто?</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>А у осьминога?: Четыре или Восемь?</td>\n",
       "      <td>5</td>\n",
       "      <td>2</td>\n",
       "      <td>5</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>А у червяка сколько?: У червяка ног не бывает ...</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Какого цвета море?: Обычно малиновое или Чаще ...</td>\n",
       "      <td>5</td>\n",
       "      <td>2</td>\n",
       "      <td>5</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>А листва?: Зелёная или Чёрная?</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                            question  history_cons  \\\n",
       "0            Сколько ножек у стола?: Четыре или Сто?             5   \n",
       "1                 А у осьминога?: Четыре или Восемь?             5   \n",
       "2  А у червяка сколько?: У червяка ног не бывает ...             5   \n",
       "3  Какого цвета море?: Обычно малиновое или Чаще ...             5   \n",
       "4                     А листва?: Зелёная или Чёрная?             5   \n",
       "\n",
       "   history_lb  no_history_cons  no_history_lb  \n",
       "0           1                5              1  \n",
       "1           2                5              2  \n",
       "2           1                5              1  \n",
       "3           2                5              2  \n",
       "4           1                5              1  "
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame({\n",
    "    'question': df1['question'],\n",
    "    'history_cons': df1['cons'],\n",
    "    'history_lb': df1['pred'],\n",
    "    'no_history_cons': df2['cons'],\n",
    "    'no_history_lb': df2['pred'],\n",
    "})\n",
    "df.head(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "В колонках `history_cons` и `no_history_cons` числа для определения согласованности разметки - большинство по какой-либо категории (1 или 2)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>С показом истории</th>\n",
       "      <th>Без показа истории</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>294</td>\n",
       "      <td>359</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>93</td>\n",
       "      <td>51</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>43</td>\n",
       "      <td>20</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   С показом истории  Без показа истории\n",
       "5                294                 359\n",
       "4                 93                  51\n",
       "3                 43                  20"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame({\n",
    "    \"С показом истории\": df['history_cons'].value_counts(),\n",
    "    \"Без показа истории\": df['no_history_cons'].value_counts(),\n",
    "})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Согласованность и не могла быть меньше 3 человек на задание (ведь перекрытие всегда 5, а меток всего 2)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Теперь соединяем с правильными метками для подсчета метрик."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "with open('task.json', 'r', encoding='utf-8') as f:\n",
    "    data = json.load(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>question</th>\n",
       "      <th>history_cons</th>\n",
       "      <th>history_lb</th>\n",
       "      <th>no_history_cons</th>\n",
       "      <th>no_history_lb</th>\n",
       "      <th>true</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Сколько ножек у стола?: Четыре или Сто?</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                  question  history_cons  history_lb  \\\n",
       "0  Сколько ножек у стола?: Четыре или Сто?             5           1   \n",
       "\n",
       "   no_history_cons  no_history_lb  true  \n",
       "0                5              1     1  "
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test = data['data']['test'][0]\n",
    "true = [test[i]['outputs'] for i in range(len(test))]\n",
    "df['true'] = pd.Series(true).astype(int)\n",
    "df.head(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy для сеттинга с показом истории ответов ==> 0.9418604651162791 <==\n",
      "Accuracy для сеттинга без показа истории ответов ==> 0.9767441860465116 <==\n"
     ]
    }
   ],
   "source": [
    "print(f\"Accuracy для сеттинга с показом истории ответов ==> {(df['true'] == df['history_lb']).mean()} <==\")\n",
    "print(f\"Accuracy для сеттинга без показа истории ответов ==> {(df['true'] == df['no_history_lb']).mean()} <==\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Удивительно, но показ истории немного уменьшил метрики."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Анализ результатов"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Посмотрим на задания, где ответы различаются."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['history_cor'] = (df['history_lb'] == df['true']) * 1\n",
    "df['no_history_cor'] = (df['no_history_lb'] == df['true']) * 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Посмотрим на вопросы, где с историей ошибка, а без — правильно."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "16"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df[(df['history_cor'] == 0) & (df['no_history_cor'] == 1)])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Всего 16 вопросов:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ВОПРОС: За сколько времени Земля делает оборот вокруг своей оси?: За 23 часа 56 минут и 4 секунды или За 24 часа 00 минут и 00 секунд?\n",
      "ОТВЕТ: 1\n",
      "ВОПРОС: А «КНР»?: Китайская Народная Республика или Корейская Народная Республика?\n",
      "ОТВЕТ: 1\n",
      "ВОПРОС: А спички из бумаги?: Нет или Да?\n",
      "ОТВЕТ: 2\n",
      "ВОПРОС: А сейчас «пять цифр «восемь»?: Пять цифр «восемь» или 88888?\n",
      "ОТВЕТ: 1\n",
      "ВОПРОС: Шахматный конь стоит на клетке d7. На какой клетке у него больше шансов оказаться в следующем ходу, b6 или e8?: b6 или e8?\n",
      "ОТВЕТ: 1\n",
      "ВОПРОС: Кто кому приказания отдаёт: старпом боцману или боцман старпому?: Боцман старпому или Старпом боцману?\n",
      "ОТВЕТ: 2\n",
      "ВОПРОС: Правда ли, что у светлячков обычно светятся только самки?: Нет или Да?\n",
      "ОТВЕТ: 1\n",
      "ВОПРОС: Сколько звонких согласных в слове «колос»?: 3 или 1?\n",
      "ОТВЕТ: 2\n",
      "ВОПРОС: Лебедь съел 100 г моллюсков на Сером пруду, 250 г моллюсков на Веронихином пруду, по 50 грамм моллюсков на прудах Приплёсском, Винницыном и Ровном и ещё 200 г на Куньем пруду. Сколько всего прудов облетел лебедь, если известно, что на двух прудах он не нашёл ничего съедобного?: 8 или 6?\n",
      "ОТВЕТ: 1\n",
      "ВОПРОС: Сколько закрывающих скобок надо убрать в последовательности «((())))», чтобы закрылись все скобки?: 1 или 2?\n",
      "ОТВЕТ: 1\n",
      "ВОПРОС: Если к слову, которым обозначено число 11, присоединить без пробела слово, которым обозначено название, которое я просил тебя запомнить, что получится?: Рурьвыпрямлятор или Рурьрурь?\n",
      "ОТВЕТ: 1\n",
      "ВОПРОС: В абсолютно тёмной комнате сидят шесть кошек. Каждая из них расположена так, чтобы могла видеть всех остальных. Сколько кошек видит каждая из них?: Ни одной или Пять?\n",
      "ОТВЕТ: 2\n",
      "ВОПРОС: Высота горы 20 метров. По горе проходит дорога, причём длина подъёма и спуска одинаковы. Велосипедист потратил 3 минуты на подъём на гору и 1 минуту на спуск. На какой высоте он теперь находится?: На нулевой высоте или На высоте 7 метров?\n",
      "ОТВЕТ: 1\n",
      "ВОПРОС: Дормидонт и Кощей Бессмертный играют в следующую игру. Перед ними две кучки, в первой один камешек, а во второй — два. Игроки делают свои ходы по очереди и каждым ходом игрок может взять из любой из кучек любое число камешков. Проигрывает тот, кто заберёт последний камешек. Дормидонт ходит первым. Из какой кучки ему нужно взять камешки, чтобы победить?: Из первой или Из второй?\n",
      "ОТВЕТ: 2\n",
      "ВОПРОС: Зорро и Карлсон играют в следующую игру. Перед ними три кучки, в первой один камешек, во второй — три, в третьей тоже один камешек. Игроки делают свои ходы по очереди и каждым ходом игрок может взять из любой из кучек любое число камешков. Проигрывает тот, кто заберёт последний камешек. Карлсон ходит первым. Из какой кучки ему нужно взять камешки, чтобы победить?: Из второй или Из третьей?\n",
      "ОТВЕТ: 1\n",
      "ВОПРОС: Последние три вопроса были совершенно серьёзными, без тени шутки?: Да или Нет?\n",
      "ОТВЕТ: 2\n"
     ]
    }
   ],
   "source": [
    "for idx, row in df[(df['history_cor'] == 0) & (df['no_history_cor'] == 1)].iterrows():\n",
    "    print(f\"ВОПРОС: {row['question']}\\nОТВЕТ: {row['no_history_lb']}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "В ошибках нет вопросов на память. Получается, это просто невнимательность или ошибки в знаниях у разметчиков."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Теперь вопросы, где ситуация наоборот."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df[(df['history_cor'] == 1) & (df['no_history_cor'] == 0)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ВОПРОС: Если написать подряд буквы «I» и «О» и соединить их горизонтальной чертой, то на какую букву это будет меньше похоже, на Ю или на Б?: Ю или Б?\n",
      "ОТВЕТ: 2\n"
     ]
    }
   ],
   "source": [
    "for idx, row in df[(df['history_cor'] == 1) & (df['no_history_cor'] == 0)].iterrows():\n",
    "    print(f\"ВОПРОС: {row['question']}\\nОТВЕТ: {row['history_lb']}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Всего один вопрос, где с историей ответ правильный, а без истории — нет. Но этот вопрос никак не связан с памятью."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Какие ошибки общие?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df[(df['history_cor'] == 0) & (df['no_history_cor'] == 0)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ВОПРОС: 6+2?: 12 или 7?\n",
      "ОТВЕТ: 2\n",
      "ВОПРОС: А шесть плюс два?: Семь или Двенадцать?\n",
      "ОТВЕТ: 1\n",
      "ВОПРОС: Есть ли у кота шпоры?: Нет или Да?\n",
      "ОТВЕТ: 1\n",
      "ВОПРОС: А ежели кит на слона нападёт, кто кого поборет? Ответь на этот вопрос наоборот?: Слон кита или Кит слона?\n",
      "ОТВЕТ: 1\n",
      "ВОПРОС: А два кружочка?: Нет или Да?\n",
      "ОТВЕТ: 1\n",
      "ВОПРОС: А ковырять в носу?: Да или Нет?\n",
      "ОТВЕТ: 1\n",
      "ВОПРОС: Может ли длина окружности быть больше, чем длина полуокружности того же радиуса?: Да или Нет?\n",
      "ОТВЕТ: 1\n",
      "ВОПРОС: Сколько ударений в слове автомотоклуб?: Одно или Три?\n",
      "ОТВЕТ: 2\n",
      "ВОПРОС: Митя запускал планёр в сторону юга, но встречный ветер погнал его в противоположную сторону. Затем ветер сменился, планёр повлекло направо. Потом он повернул налево, ещё и ещё налево. В каком направлении теперь летит планёр, если он каждая смена направления кратна 90 градусам?: На юг или На запад?\n",
      "ОТВЕТ: 1\n"
     ]
    }
   ],
   "source": [
    "for idx, row in df[(df['history_cor'] == 0) & (df['no_history_cor'] == 0)].iterrows():\n",
    "    print(f\"ВОПРОС: {row['question']}\\nОТВЕТ: {row['true']}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Снова невнимательность, недопонимание инструкции (нужно наиболее близкий к правде искать ответ), а также простые ошибки. Например, кажется, про шпоры у кота разметчики вспомнили \"кота в сапогах\"."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
